package cn.tedu.medicalmanagementsystem.user.service;

import cn.tedu.medicalmanagementsystem.base.response.JsonResult;
import cn.tedu.medicalmanagementsystem.base.response.StatusCode;
import cn.tedu.medicalmanagementsystem.user.mapper.UserMapper;
import cn.tedu.medicalmanagementsystem.user.pojo.entity.User;
import cn.tedu.medicalmanagementsystem.user.pojo.vo.UserVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.tedu.medicalmanagementsystem.user.pojo.dto.UserUpdateParam;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;

import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;
@Transactional
@Slf4j
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    // 用户注册
    public JsonResult register(User userRegParam) {
        log.debug("开始处理用户注册请求，参数：{}", userRegParam);

        // 检查用户名是否已存在
        if (userMapper.selectByUsername(userRegParam.getUsername()) != null) {
            return new JsonResult(StatusCode.USERNAME_EXISTS);
        }
        // 创建用户对象
        User user = new User();
        BeanUtils.copyProperties(userRegParam, user);
        // 设置注册时间
        user.setCreateTime(LocalDateTime.now());

        // 插入用户数据
        int rows = userMapper.insert(user);
        if (rows != 1) {
            return new JsonResult(StatusCode.OPERATION_FAILED);
        }
        return JsonResult.ok();
    }

    // 获取用户信息
    @GetMapping("/info")
    public JsonResult<UserVO> getInfo(HttpSession session) {
        // 1. 从Session中获取当前登录用户信息
        UserVO currentUser = (UserVO) session.getAttribute("user");

        // 2. 检查用户是否登录
        if (currentUser == null) {
            return JsonResult.fail(StatusCode.NOT_LOGIN, "用户未登录");
        }

        // 3. 根据session中的用户ID查询最新用户信息
        User user = userMapper.selectById(currentUser.getId());
        if (user == null) {
            return JsonResult.fail(StatusCode.USER_NOT_EXIST, "用户不存在或已被删除");
        }

        // 4. 更新并返回用户信息
        UserVO userVO = new UserVO();
        BeanUtils.copyProperties(user, userVO);

        // 5. 可选：更新session中的用户信息
        session.setAttribute("user", userVO);

        return JsonResult.ok(userVO);
    }
    /**
     * 修改个人信息
     *
     * @param userUpdateParam 用户更新参数
     * @param userId          当前用户ID
     * @return 操作结果
     */
    @Transactional
    public JsonResult updateUser(UserUpdateParam userUpdateParam) {
        log.debug("开始处理修改个人信息请求，用户ID：{}，参数：{}", userUpdateParam);


        User currentUser = userMapper.selectById(userUpdateParam.getUserId());

        // 检查手机号是否已被其他用户使用
        if (userUpdateParam.getPhone() != null &&
                !userUpdateParam.getPhone().equals(currentUser.getPhone())) {
            if (userMapper.phoneExists(userUpdateParam.getPhone()) > 0) {
                return new JsonResult(StatusCode.PHONE_EXISTS);
            }
        }

        // 检查邮箱是否已被其他用户使用
        if (userUpdateParam.getEmail() != null &&
                !userUpdateParam.getEmail().equals(currentUser.getEmail())) {
            if (userMapper.emailExists(userUpdateParam.getEmail()) > 0) {
                return new JsonResult(StatusCode.EMAIL_EXISTS);
            }
        }

        // 更新用户信息
        User user = new User();
        BeanUtils.copyProperties(userUpdateParam, user);

        // 处理密码更新（如果提供了新密码）
        if (userUpdateParam.getPassword() != null && !userUpdateParam.getPassword().isEmpty()) {
            // 在实际项目中，这里应该对新密码进行加密处理
            user.setPassword(userUpdateParam.getPassword());
        } else {
            // 不更新密码
            user.setPassword(null);
        }

        try {
            int rows = userMapper.update(userUpdateParam);
            if (rows != 1) {
                log.error("更新用户信息失败", userUpdateParam);
                return new JsonResult(StatusCode.OPERATION_FAILED);
            }
            log.info("用户信息更新成功", userUpdateParam);
            return JsonResult.ok("个人信息更新成功");
        } catch (Exception e) {
            log.error("更新用户信息时发生异常，用户ID：{}，异常：{}", userUpdateParam.getUserId(), e.getMessage());
            return new JsonResult(StatusCode.SYSTEM_ERROR);
        }
    }
}